/*********************************************************************************
 *      Copyright:  (C) 2020 Tang Zhiqiang<t_zhiqiang@163.com>
 *                  All rights reserved.
 *
 *       Filename:  message_callbak.c
 *    Description:  This file is send ack/nak message to cilent point.
 *                 
 *        Version:  1.0.0(04/27/2020)
 *         Author:  Tang Zhiqiang <t_zhiqiang@163.com>
 *      ChangeLog:  1, Release initial version on "04/27/2020 10:31:39 PM"
 *                 
 ********************************************************************************/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include "crc-itu-t.h"
#include "tlv.h"
#include "message_callback.h"


/*
* 功能：    发送ACK/NAK报文；
* cli_fd：  文件描述符；
* tag：     TLV当中的tag；
* buf_val:   TLV的value；
* 返回值：  无；
*/
void message_callback(int cli_fd,  unsigned char tag,  unsigned char *buf_val)
{
    unsigned char            val[1];
    unsigned char   h_tlv_crc[128];  
    unsigned short  crc16;
    union_s         *zero_p;

    print_test;     //打印函数名和行号的宏定义 
    val[0] = buf_val[0];
    //定义为char有问题，0xfd最高位为1，被认为是符号位
    h_tlv_crc[0]=(unsigned char )HEADER;
    
    zero_p = tlv_pack(tag, (uint8_t)sizeof(val), val); 
    //union_s当中第一个字节为TLV的大小
    print_test;
    
    //加上报文头
    memcpy(&h_tlv_crc[1], &zero_p->buf[1], zero_p->tlv.size);
    /* CRC校验包含head和TLV */
    crc16 = crc_itu_t(MAGIC_CRC, (unsigned char *)h_tlv_crc, zero_p->tlv.size+1); 
    //将CRC的2字节的校验值，转化成两个一字节存在unsigned char 
    ushort_to_bytes((unsigned char *)&h_tlv_crc[zero_p->tlv.size+1], crc16);

    write(cli_fd, h_tlv_crc, zero_p->tlv.size+3); //发送有效个数据
    
    free(zero_p);   //union联合包含零常数组的动态分配内存
    zero_p = NULL;
    return ;
}


